//package poidemo.poi;
//
//import org.apache.poi.ooxml.POIXMLDocumentPart;
//import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
//import org.apache.poi.openxml4j.opc.OPCPackage;
//import org.apache.poi.openxml4j.opc.PackagePart;
//import org.apache.poi.openxml4j.opc.PackagePartName;
//import org.apache.poi.openxml4j.opc.PackagingURIHelper;
//import org.apache.poi.xwpf.usermodel.XWPFDocument;
//import org.apache.poi.xwpf.usermodel.XWPFParagraph;
//import org.apache.poi.xwpf.usermodel.XWPFRelation;
//import org.apache.poi.xwpf.usermodel.XWPFRun;
//import org.apache.xmlbeans.XmlException;
//import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
//import org.w3c.dom.Node;
//import org.w3c.dom.NodeList;
//
//import java.io.FileInputStream;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.math.BigInteger;
//import java.util.*;
//
//import static org.apache.poi.ooxml.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;
//
///**
// * 添加批注测试
// */
//public class DocxDemo1 {
//
//    public static void main(String[] args) throws IOException, OpenXML4JException, XmlException {
//
//        String docxPath = "docxs/1597479610835.docx"; // createDocx();
//        XWPFDocument doc = new XWPFDocument(new FileInputStream(docxPath));
//        addComment(doc);
//    }
//
//    /**
//     * 在文档第一段上添加一个测试批注
//     * @param doc
//     * @throws OpenXML4JException
//     * @throws IOException
//     * @throws XmlException
//     */
//    public static void addComment(XWPFDocument doc) throws OpenXML4JException, IOException, XmlException {
//
//        // 获取原有的所有批注对象
//        List<CTComment> allComments = parseComments(doc);
//
//        OPCPackage pkg = doc.getPackage();
//
//        PackagePartName partName = PackagingURIHelper.createPartName("/word/comments.xml");
//        PackagePart commentPkgPart = pkg.getPart(partName);
//        // 如果之前已经存在批注文件，则先移除，后面重新添加
//        if (commentPkgPart != null) {
//            pkg.removePart(commentPkgPart);
//        }
//        // 添加批注文件：/word/comments.xml
//        commentPkgPart = pkg.createPart(partName, "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml");
//        // 创建批注part
//        XWPFCommentsPart commentsPart = new XWPFCommentsPart(commentPkgPart);
//        doc.addRelation("rId" + (doc.getRelationParts().size() + 1), XWPFRelation.COMMENT, commentsPart);
//
//        // 生成批注id
//        BigInteger commentId = BigInteger.valueOf(UUID.randomUUID().hashCode());
//        System.out.println("commentId:" + commentId);
//
//        CTComments comments = commentsPart.getComments();
//        // 将文档原有的批注保存
//        comments.setCommentArray(allComments.toArray(new CTComment[1]));
//
//        // 创建新的批注
//        CTComment ctComment = comments.addNewComment();
//        ctComment.setAuthor("lufeng");
//        ctComment.setInitials("lufeneg");
//        ctComment.setDate(Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai")));
//        ctComment.setId(commentId);
//        ctComment.addNewP().addNewR().addNewT().setStringValue("批注测试:" + commentId);
//
//        // 获取第一段
//        XWPFParagraph para = doc.getParagraphArray(0);
//        CTP ctp = para.getCTP();
//        Node ctpNode = ctp.getDomNode();
//
//        // 创建批注开始便签
//        CTMarkupRange ctMarkupRangeStart = ctp.addNewCommentRangeStart();
//        ctMarkupRangeStart.setId(commentId);
//        Node commentStartNode = ctMarkupRangeStart.getDomNode();
//        // 创建批注结束标签
//        CTMarkupRange ctMarkupRangeEnd = ctp.addNewCommentRangeEnd();
//        ctMarkupRangeEnd.setId(commentId);
//        Node commentEndNode = ctMarkupRangeEnd.getDomNode();
//
//        // 将批注开始标签和结束标签分别放到第一段的开头和第一段的结束位置
//        NodeList childNodes = ctpNode.getChildNodes();
//
//        Node firstChild = null;
//        Node secondChild = null;
//        if (childNodes.getLength() > 0) {
//            firstChild = childNodes.item(0);
//        }
//        if (childNodes.getLength() > 1) {
//            secondChild = childNodes.item(1);
//        }
//        if (firstChild != null) {
//            // 开始标签放到第一段之前
//            ctpNode.insertBefore(commentStartNode, firstChild);
//            // 结束标签放到第一段之后（即第二段之前），如果没有第二段，则直接追加到最后即可
//            if (secondChild != null) {
//                ctpNode.insertBefore(commentEndNode, secondChild);
//            } else {
//                ctpNode.appendChild(commentEndNode);
//            }
//            // 还要在段落添加一个批注引用标签
//            CTR commentRefCtr = ctp.addNewR();
//            CTMarkup commentRef = commentRefCtr.addNewCommentReference();
//            commentRef.setId(commentId);
//        }
//        // 保存
//        FileOutputStream fos = new FileOutputStream("docxs/" + System.currentTimeMillis() + ".docx");
//        doc.write(fos);
//    }
//
//    /**
//     * 获取docx所有的批注对象
//     * @param docx
//     * @throws IOException
//     * @throws XmlException
//     */
//    public static List<CTComment> parseComments(XWPFDocument docx) throws IOException, XmlException {
//
//        List<CTComment> comments = new ArrayList<>();
//        List<POIXMLDocumentPart.RelationPart> relationParts = docx.getRelationParts();
//        for (POIXMLDocumentPart.RelationPart rp : relationParts) {
//            POIXMLDocumentPart p = rp.getDocumentPart();
//            String relation = rp.getRelationship().getRelationshipType();
//            if (relation.equals(XWPFRelation.COMMENT.getRelation())) {
//                CommentsDocument cmntdoc = CommentsDocument.Factory.parse(p.getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
//                comments.addAll(cmntdoc.getComments().getCommentList());
//            }
//        }
//        return comments;
//    }
//
//
//    /**
//     * 创建一个测试的docx文档
//     * @return
//     * @throws IOException
//     */
//    public static String createDocx() throws IOException {
//        XWPFDocument doc = new XWPFDocument();
//        XWPFParagraph paragraph = doc.createParagraph();
//        XWPFRun run = paragraph.createRun();
//        run.setText("你好啊");
//        run.addBreak();
//        run.setText("哈哈哈");
//        run.addBreak();
//        run.setText("最后一句");
//        run.addBreak();
//
//
//        XWPFRun run2 = paragraph.createRun();
//        run2.setText("你好啊2");
//        run2.addBreak();
//        run2.setText("哈哈哈2");
//        run2.addBreak();
//        run2.setText("最后一句2");
//        run2.addBreak();
//
//        XWPFRun run3 = paragraph.createRun();
//        run3.setText("你好啊3");
//        run3.addBreak();
//        run3.setText("哈哈哈3");
//        run3.addBreak();
//        run3.setText("最后一句3");
//        run3.addBreak();
//
//        String filePath = "docxs/" + System.currentTimeMillis() + ".docx";
//        doc.write(new FileOutputStream(filePath));
//
//        return filePath;
//    }
//}
